package com.tembli.skills.web;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import javax.faces.FactoryFinder;
import javax.faces.application.ApplicationFactory;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.tembli.skills.model.User;
import com.tembli.skills.service.UserService;

public class UserForm {
	private final Log log = LogFactory.getLog(UserForm.class);
	private String id;
	public User user = new User();
	public UserService srvc;

	public String getId() {
		return id;
	}

	public void setId(final String id) {
		this.id = id;
	}

	public User getUser() {
		return user;
	}

	public void setUser(final User user) {
		this.user = user;
	}

	public void setUserService(final UserService userService) {
		this.srvc = userService;
	}

	public String edit() {

		if (id != null) {
			// assuming edit
			setUser(srvc.getUser(id));
		}

		return "success";
	}

	public String save() {
		srvc.saveUser(getUser());
		addMessage("user.saved", getUser().getFullName());

		return "success";
	}

	public String delete() {
		srvc.removeUser(getUser().getId().toString());
		addMessage("user.deleted", getUser().getFullName());

		return "success";
	}

	// Convenience methods ====================================================
	public static String getRequestParameter(final String name) {
		return FacesContext.getCurrentInstance().getExternalContext()
				.getRequestParameterMap().get(name);
	}

	public void addMessage(final String key, final String arg) {
		// sure is a lot of work to get the named ResourceBundle in JSF, eh?
		ApplicationFactory factory = (ApplicationFactory) FactoryFinder
				.getFactory(FactoryFinder.APPLICATION_FACTORY);
		String bundleName = factory.getApplication().getMessageBundle();
		ResourceBundle messages = ResourceBundle.getBundle(bundleName);

		// it's even more work to format a message with args
		MessageFormat form = new MessageFormat(messages.getString(key));

		String msg = form.format(new Object[] { arg });

		// add message to session so it can live past redirects
		// the MessageFilter class will take care of removing it
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(true);
		session.setAttribute("message", msg);
	}
}
